My first Flex Dashboard
---
title: "COVID-19"
output:
flexdashboard::flex_dashboard:
orientation: rows
vertical_layout: scroll
source_code: embed
---
```{r setup, include=FALSE}
# Load libraries
library(flexdashboard)
library(covidvirus)
library(tidyverse)
library(plotly)
library(DT)
# Acquire Data
virus <- covidvirus::get_cases(wide=T)
# define colors
clr_active = 'orange'
clr_confirmed = 'blue'
clr_dead = 'darkred'
clr_recovered = 'forestgreen'
clr_total = 'blue'
clr_states = 'purple'
# replace NAs with zeros
virus <- virus %>%
mutate(
confirmed = ifelse(is.na(confirmed), 0, confirmed),
death = ifelse(is.na(death), 0, death),
recovered = ifelse(is.na(recovered), 0, recovered),
active = confirmed - death - recovered,
country= case_when(
country_region == 'United Arab Emirates' ~ 'UAE',
country_region == 'United States' ~ 'USA',
country_region == 'North Macedonia' ~ 'N. Macedonia',
TRUE ~ country_region
)
) %>%
select(-country_region)
# data summaries - country
country_totals <- virus %>%
group_by(country) %>%
summarize(
confirmed = sum(confirmed),
death = sum(death),
recovered = sum(recovered),
active = sum(active)
) %>%
ungroup %>%
arrange(desc(confirmed)) %>%
mutate(country = factor(country, levels = country))
daily_totals <- virus %>%
pivot_longer(
cols = confirmed:active,
names_to = 'type',
values_to = 'cases'
) %>%
group_by(date, type) %>%
summarize(
cases = sum(cases)
) %>%
ungroup()
# data summaries - US
usdf <- virus %>%
filter(country == 'USA') %>%
select(-province_state, -city_county, -continent, -lat, -long, -country) %>%
filter(!state %in% c('Diamond Princess', 'Grand Princess'))
us_totals <- usdf %>%
group_by(state) %>%
summarize(
confirmed = sum(confirmed),
death = sum(death),
recovered = sum(recovered),
active = sum(active)
) %>%
ungroup %>%
arrange(desc(confirmed)) %>%
mutate(state = factor(state, levels = state))
us_daily <- usdf %>%
pivot_longer(
cols = confirmed:active,
names_to = 'type',
values_to = 'cases'
) %>%
group_by(date, type) %>%
summarize(
cases = sum(cases)
) %>%
ungroup()
```
Summary
=======================
Row
-----------------------------------------------------------------------
### Countries
```{r}
valueBox(length(unique(country_totals$country)), color = clr_states)
```
### Confirmed
```{r}
total_confirmed = sum(country_totals$confirmed)
valueBox(total_confirmed, icon = 'fa-user-md', color = clr_total)
```
### Active Cases
```{r}
active_cases = sum(country_totals$active)
pct_active = round((active_cases / total_confirmed) * 100,1)
valueBox(paste0(active_cases," (",pct_active,"%)"), icon = 'fa-hospital', color = clr_active)
```
### Recovered
```{r}
total_recovered = sum(country_totals$recovered)
pct_recovered = round((total_recovered / total_confirmed) * 100,1)
valueBox(paste0(total_recovered," (",pct_recovered,"%)"), icon = 'fa-walking', color = clr_recovered)
```
### Deaths
```{r}
total_deaths = sum(country_totals$death)
pct_dead = round((total_deaths / total_confirmed) * 100, 1)
valueBox(paste0(total_deaths," (", pct_dead, "%)"), icon = 'fa-dizzy', color = clr_dead)
```
Row
-----------------------------------------------------------------------
```{r, echo=FALSE}
```
### Top 25 Countries with Confirmed Cases
```{r}
top25 <- country_totals %>%
arrange(desc(confirmed)) %>%
head(25)
plot_ly(data = top25,x = ~country, y = ~active, type = 'bar', name = 'Active', marker = list(color = clr_active)) %>%
add_trace(y = ~recovered, name = 'Recovered', marker = list(color = clr_recovered)) %>%
add_trace(y = ~death, name = 'Dead', marker = list(color = clr_dead)) %>%
layout(barmode = 'stack', yaxis = list(title = 'Total Cases (log scale)', type = 'log'))
```
Row
-----------------------------------------------------------------------
### Daily Cumulative Cases by Type
```{r}
dailies <- daily_totals %>%
pivot_wider(
names_from = type,
values_from = cases,
values_fill = list(cases = 0)
) %>%
arrange(date) %>%
mutate(
total_active = cumsum(active),
total_confirmed = cumsum(confirmed),
total_dead = cumsum(death),
total_recovered = cumsum(recovered)
) %>%
select(-active, -confirmed, -death, -recovered)
plot_ly(data = dailies, x = ~date, y = ~total_active, name='Active', type = 'scatter', mode = 'lines+markers', line = list(color = clr_active), marker = list(color = clr_active)) %>%
add_trace(y = ~total_dead, name = 'Dead', type = 'scatter', mode = 'lines+markers', line = list(color = clr_dead), marker = list(color = clr_dead)) %>%
add_trace(y = ~total_recovered, name = 'Recovered', type = 'scatter', mode = 'lines+markers', line = list(color= clr_recovered), marker = list(color=clr_recovered)) %>%
layout(yaxis = list(title = 'Cumulative Total Cases (log scale)', type = 'log'))
```
### Active, Recovery, & Death Rates by Country (minimum 50 confirmed cases)
```{r}
country_rates <- country_totals %>%
mutate(
active_pct = round((active / confirmed)*100,1),
dead_pct = round((death / confirmed) * 100, 1),
recover_pct = round((recovered / confirmed) * 100, 1)
) %>%
arrange(desc(confirmed)) %>%
select(country = country, confirmed, active_pct, dead_pct, recover_pct) %>%
filter(confirmed >= 50)
datatable(country_rates,
rownames = F,
colnames = c("Country", "Confirmed", "Active Rate", "Death Rate", "Recovery Rate"),
options = list(dom = 'tip')
)
```
US Overview
=============================
Row
--------------
### States
```{r}
state_count = usdf %>% filter(confirmed > 0 & !state %in% c('Diamond Princess','Grand Princess')) %>% select(state) %>% distinct() %>% count()
valueBox(value = state_count, color = clr_states)
```
### Confirmed
```{r}
us_confirmed = sum(usdf$confirmed)
valueBox(us_confirmed, icon = 'fa-user-md', color = clr_total)
```
### Active
```{r}
us_active_cases = sum(usdf$active)
us_pct_active = round((us_active_cases / us_confirmed) * 100,1)
valueBox(paste0(us_active_cases," (",us_pct_active,"%)"), icon = 'fa-hospital', color = clr_active)
```
### Recovered
```{r}
us_recovered = sum(usdf$recovered)
us_pct_recovered = round((us_recovered / us_confirmed) * 100,1)
valueBox(paste0(us_recovered," (",us_pct_recovered,"%)"), icon = 'fa-walking', color = clr_recovered)
```
### Deaths
```{r}
us_deaths = sum(usdf$death)
us_pct_dead = round((us_deaths / us_confirmed) * 100, 1)
valueBox(paste0(us_deaths," (", us_pct_dead, "%)"), icon = 'fa-dizzy', color = clr_dead)
```
Row
---------------
### Top 10 US States
```{r}
top25_states <- us_totals %>%
arrange(desc(confirmed)) %>%
head(25)
plot_ly(data = top25_states,x = ~state, y = ~active, type = 'bar', name = 'Active', marker = list(color = clr_active)) %>%
add_trace(y = ~recovered, name = 'Recovered', marker = list(color = clr_recovered)) %>%
add_trace(y = ~death, name = 'Dead', marker = list(color = clr_dead)) %>%
layout(barmode = 'stack', yaxis = list(title = 'Total Cases (log scale)', type = 'log'), xaxis = list(title = 'State'))
```
Row
-----------------------------------------------------------------------
### Daily Cumulative Cases by Type
```{r}
us_dailies <- us_daily %>%
pivot_wider(
names_from = type,
values_from = cases,
values_fill = list(cases = 0)
) %>%
arrange(date) %>%
mutate(
total_active = cumsum(active),
total_confirmed = cumsum(confirmed),
total_dead = cumsum(death),
total_recovered = cumsum(recovered)
) %>%
select(-active, -confirmed, -death, -recovered)
plot_ly(data = us_dailies, x = ~date, y = ~total_active, name='Active', type = 'scatter', mode = 'lines+markers', line = list(color = clr_active), marker = list(color = clr_active)) %>%
add_trace(y = ~total_dead, name = 'Dead', type = 'scatter', mode = 'lines+markers', line = list(color = clr_dead), marker = list(color = clr_dead)) %>%
add_trace(y = ~total_recovered, name = 'Recovered', type = 'scatter', mode = 'lines+markers', line = list(color= clr_recovered), marker = list(color=clr_recovered)) %>%
layout(yaxis = list(title = 'Cumulative Total Cases (log scale)', type = 'log'))
```
### Active, Recovery, & Death Rates by State
```{r}
state_rates <- us_totals %>%
mutate(
active_pct = round((active / confirmed)*100,1),
dead_pct = round((death / confirmed) * 100, 1),
recover_pct = round((recovered / confirmed) * 100, 1)
) %>%
arrange(desc(confirmed)) %>%
select(state, confirmed, active_pct, dead_pct, recover_pct) %>%
filter(confirmed > 0)
datatable(state_rates,
rownames = F,
colnames = c("State", "Confirmed", "Active Rate", "Death Rate", "Recovery Rate"),
options = list(dom = 'tip')
)
```
Snapshots
============================
### Top 10 Countries with New Confirmed Cases
```{r}
current_date <- max(virus$date)
newest_confirmed_cases <- virus %>%
filter(date == current_date) %>%
select(date, country, confirmed) %>%
group_by(date, country) %>%
summarize(total_confirmed = sum(confirmed)) %>%
arrange(desc(total_confirmed)) %>%
mutate(country = factor(country, levels = unique(country))) %>%
head(10)
plot_ly(data = newest_confirmed_cases, x = ~country, y = ~total_confirmed, type = 'bar', marker = list(color = clr_confirmed)) %>%
layout(yaxis = list(title = 'Total Cases'), xaxis = list(title = 'Country'))
```
### Daily New Cases (China, US, Italy, Germany, UK)
```{r}
main_countries <- virus %>%
filter(country %in% c('USA','Italy','Germany','United Kingdom')) %>%
select(date, country, confirmed) %>%
group_by(date, country) %>%
summarize(
total_confirmed = sum(confirmed)
) %>%
ungroup() %>%
pivot_wider(
names_from = country,
values_from = total_confirmed,
values_fill = list(total_confirmed = 0)
)
plot_ly(data = main_countries, x = ~date, y = ~Germany, type = 'scatter', name = 'Germany', mode = 'lines+markers', line = list(color= 'black'), marker = list(color='black')) %>%
add_trace(y = ~USA, type = 'scatter', type = 'scatter', name = 'USA', mode = 'lines+markers', line = list(color= 'red'), marker = list(color='red')) %>%
add_trace(y = ~Italy, type = 'scatter', type = 'scatter', name = 'Italy', mode = 'lines+markers', line = list(color= 'green'), marker = list(color='green')) %>%
add_trace(y = ~`United Kingdom`, type = 'scatter', type = 'scatter', name = 'United Kingdom', mode = 'lines+markers', line = list(color= 'orange'), marker = list(color='orange')) %>%
layout(yaxis = list(title = 'Total Cases (log scale)', type = 'log'))
```
About
==============================
My first Flex Dashboard